
## 简单的 AI
## 能进行攻击与移动
## 不过不会连续移动
## 也不会使用技能
## 会对最近的敌人进行攻击

class_name ControllerAIOrdinary
extends ControllerAI




var map: SceneMap = null
var unit_manage: SceneUnitManage = null

# 能触及的范围
# 结构：key=移动的目标位置 value=攻击范围数组
var path: Dictionary = {}
var all_unit: Array[Unit] = []
var attack_scope: PackedVector2Array = []
var attack_scope_units: Array[Unit] = []




func ai_start() -> void:
	path.clear()
	all_unit.clear()
	attack_scope.clear()
	attack_scope_units.clear()
	
	map = get_node("../../").map
	unit_manage = get_node("../../").unit_manage
	
	await ai_action()
	await get_tree().create_timer(0.25).timeout
	
	path.clear()
	all_unit.clear()
	attack_scope.clear()
	attack_scope_units.clear()
	
	ai_end()




func ai_action() -> void:
	get_attack_range()
	
	# 如果说攻击范围内没有敌人
	# 就调用 ai_move 向敌人靠近
	if attack_scope_units.is_empty():
		var target: Vector2 = get_load_shortest(all_unit)[0]
		await ai_move(target)
	# 调用 ai_attack 进行攻击
	else:
		await  ai_attack()




#func ai_end() -> void:
#	pass




# ai 的 move 方法
func ai_move(_target: Vector2) -> void:
	var range: Dictionary = map.get_unit_move_range(current_unit, true)
	var cells_info: Dictionary = {}
	
	for pos in range:
		# 获取位置上的图块信息
		var cells: Dictionary = map.get_position_all_layer_call(pos)
		
		for layer in cells:
			var cell: Dictionary = cells[layer]
			var info: Dictionary = map.get_tileset_cell_info(cell["tileset"], cell["id"], cell["position"])
			
			if not info.is_empty():
				cells_info[pos] = info
	
	# 调用移动
	await current_unit.action.move_conduct(map.pathfinding(current_unit, range, _target), cells_info)
	await get_tree().create_timer(0.3).timeout




# ai 的 attack 方法
func ai_attack() -> void:
	# attack_scope_units
	# 找一个最近的进行攻击
	var target: Unit = get_load_shortest(attack_scope_units)[1]
	# 找寻下一个能攻击到 target 的点
	var pos: Vector2 = Vector2.ZERO
	for key in path:
		if path[key].find(target.position) != -1:
			pos = key
			break
	#print(path)
	# 移动到目标点
	# 如果自己站在原位就不移动
	# 如果不是就移动
	if pos != current_unit.position:
		await ai_move(pos)
	
	# 进行攻击
	# 检查自己的位置
	if path[current_unit.position].find(target.position) != -1:
		await current_unit.action.attack_conduct(target)
	
	await get_tree().create_timer(0.3).timeout




# ai 的 skill 方法
func ai_skill() -> void:
	pass




# 获取攻击区域
func get_attack_range() -> void:
	# 获取移动路径
	var gumr: Array = map.get_unit_move_range(current_unit, true).keys()
	all_unit = unit_manage.get_all_units()
	
	# 删掉与其它 unit 重叠的部分
	for unit in all_unit:
		# 保留自己的位置
		if unit == current_unit:
			continue
		
		gumr.erase(unit.position)
	
	# 生成攻击范围
	for item in gumr:
		var scope: PackedVector2Array = unit_manage.get_unit_attack_scope(current_unit, item)
		path[item] = scope
		attack_scope.append_array(scope)
	
	attack_scope_units = unit_manage.get_position_units(attack_scope)
	
	# 删除与自己同阵营的,倒序遍历
	for index in range(attack_scope_units.size() - 1, -1, -1):
		# 如果同阵营就删掉
		if attack_scope_units[index].controller.camp == current_unit.controller.camp:
			attack_scope_units.remove_at(index)




# 获取最近的目标
# 0: 位置
# 1：最近的目标
func get_load_shortest(_units: Array[Unit]) -> Array:
	var target_unit: Unit = null
	var target_pos: Vector2 = Vector2.ZERO
	var curr: Vector2 = Vector2.ZERO
	
	# 找寻敌人(最近的敌人)
	for unit in _units:
		for pos in path.keys():
			var load: Vector2 = unit.position - pos
			
			if target_pos == Vector2.ZERO:
				target_unit = unit
				target_pos = pos
				curr = load
			
			elif load > curr:
				target_unit = unit
				target_pos = pos
				curr = load
	
	return [target_pos, target_unit]
